CrackMe No. 4
by AndrΘnalin
Tutorial de Lucifer48 [Immortal Descendants]
(25 Ao√t 1999)
C'est du VB6 (personnellement, je trouve τa largement plus facile α cracker que le VB5).
En utilisant SmartCheck (ou tout bΩtement, un petit peu d'observation), on se rend compte que
qu'il y a un timer; ce qui veut dire: le serial est testΘ en boucle (comme winamp par exemple).
J'entre illico quelques chiffres: 1, 9, 9, 9,... et je pose un bpx hmemcpy. F10, F10, on sort
de MSVBVM60!.text et on arrive α VB_CRKME4!.text:
CALL [EAX+000000A0]
CMP EAX,ESI
JGE ...
PUSH 00000A0
Hmemcpy s'arrΩte ici α plusieurs endroits:
XXXX:0040B24F et XXXX:0040B320
XXXX:00406B2F et XXXX:00406B00
XXXX:00408EBF et XXXX:00408F90
(j'en ai peut-Ωtre oubliΘ ?)
En regardant les adresses, on voit tout de suite que le timer exΘcute les routines bien
distinctent: en effet, XXXX:0040B24F et XXXX:0040B320 sont peu ΘloignΘs et appartiennent α la
mΩme routine (il en est de mΩme pour XXXX:00408EBF et XXXX:00408F90; ... ).
On a donc plusieurs procΘdures α analyser; et les adresses ci-dessus correspondent grosso-modo au dΘbut
de la procΘdure de vΘrification, on a plus qu'a tracer pour voir ce qu'il se passe.
Etudions la premiΦre routine sur laquelle on tombe (ici en XXXX:0040B24F):
XXXX:0040B3A1 MOV [EBP-00B4],ESI
XXXX:0040B3A7 MOV [EBP-00C4],ESI
XXXX:0040B3AD CALL [MSVBVM60!__vbaLenVar] ;d *(eax+8) pour voir son serial...
On arrive α une boucle:
XXXX:0040B432 CALL [MSVBVM60!rtcMidCharCharBstr]
...
XXXX:0040B444 CALL [MSVBVM60!rtcAnsiValueBstr] ;rΘsultat en al
...
XXXX:0040B469 FLD REAL8 PTR [EBP-030C] ;notre valeur ascii
XXXX:0040B46F FADD REAL8 PTR [EBP-00CC] ;+1 (dans mon cas)
...
XXXX:0040B489 CALL [MSVBVM60!rtcHexBstrFromVar] ;conversion en hΘxa du rΘsultat (ci-dessus)
...
XXXX:0040B505 CALL [MSVBVM60!__vbaVarForNext] ;NEXT (de la boucle)
Donc la boucle traite un α un les caractΦres de mon serial, il s'ensuit une logique comparaison:
XXXX:0040B51A PUSH EAX
XXXX:0040B51B MOV DWORD PTR [EBP-00AC], 00401E50
XXXX:0040B525 MOV DWORD PTR [EBP-00B4], 00008008
XXXX:0040B52F CALL [MSVBVM60!__vbaVarTstEq] ;Θgal ?
XXXX:0040B535 TEST AX,AX
Remarque: Voilα qu'il y a en 00401E50:
"0817E747D7AFF7C7F82836D74RR7A7F7E7B7C7D826D81KE7B7C"
Pour mon serial (1999), j'obtient: 0323A3A3A
(le zΘro est ajoutΘ devant, mais le reste c'est facile α comprendre...)
Sachant que notre serial est issu de la fonction [MSVBVM60!rtcHexBstrFromVar], on ne pourra jamais
obtenir un serial avec des R dedans, conclusion le test n'est jamais vΘrifiΘ.
En poursuivant, on voit 15 fois la mΩme routine, et α chaque fois la comparaison via
[MSVBVM60!__vbaVarTstEq] ne convient pas; la chaine comparΘe avec notre serial tranformΘ
contient des caractΦres non hΘxadΘcimaux (R, K, W, Q, ...).
Donc on va aller voir du c⌠tΘ de des autres routines... (c'est toujours des tonnes et des tonnes
de fois la mΩme chose...) et puis finalement, j'ai trouvΘ le bon endroit:
XXXX:004065E3 PUSH ECX
XXXX:004065E4 MOV DWORD PTR [EBP-00AC], 00402390
XXXX:004065EE MOV DWORD PTR [EBP-00B4], 00008008
XXXX:004065F8 CALL [MSVBVM60!__vbaVarTstEq]
La chaεne en 00402390 est: "0817E747D7A7D7C7F82836D74747A7F7E7B7C7D826D817E7B7C",
τa pourrait convenir !
Je regarde α l'instruction FADD (dans la boucle juste au-dessus), et je vois +19, et lα, on se rend
bien compte que τa va pas du tout ! On est bien loin des 82... J'ai pourtant parcouru toutes les chaεnes en
mΘmoire, c'est la seule qui puisse convenir...
Je dΘcide donc de voir d'ou vient ce +19, et finalement je trouve facilement:
XXXX:004064A2 CALL [MSVBVM60!__vbaVarForInit] ;FOR (dΘbut de la boucle)
...
XXXX:004064C7 CALL [MSVBVM60!rtcR8ValFromBstr] ;lit les deux premiers caractΦres.
XXXX:004064CD FSTP REAL8 PTR [EBP-00CC] ;pop
Mon 19 vient donc de mon serial 1999. Il faut donc que je choisisse judicieusement les deux
premiers charactΦres du serial, pour que τa conincide.
Remarque: X* ou X# donne X ( X={0,1,...,9} ).
Sachant qu'on veut obtenir 81 7E (81-7E=3); on a 6 possibilitΘs de couple:
4-1; 5-2; 6-3; 7-4; 8-5; 9-4
On doit obtenir 6D (plus petite valeur):
2Ah ("*") + 41d = 53h 23h ("#") + 41d = 4Ch
2Ah ("*") + 52d = 5Eh 23h ("#") + 52d = 57h
2Ah ("*") + 63d = 69h 23h ("#") + 63d = 62h
2Ah ("*") + 74d = 74h 23h ("#") + 74d = 6Dh OUI!!!!!!
Donc le serial commence par 74. On soustrait donc 74d (=4Ah), α toute la chaine (en 00402390):
0 37 34 2A 33 30 33 32 35 38 39 23 2A 2A 30 35 34 31 32 33 38 23 37 34 31 32
ce qui donne:
Serial/ 74*3032589#**0541238#7412
REGISTRIERT !!! Sehr gut !!!!
Greetings: All ID members (Volatility, Torn@do, ...), Eternal Bliss, ACiD BuRN,
Duelist, LaZaRuS, people on #cracking4newbies, french crackers, ...
(c) Lucifer48. All rights reversed